package com.nh.action;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper;
import org.json.simple.JSONObject;
import org.springframework.stereotype.Controller;

import com.opensymphony.xwork2.ActionSupport;

/**
 * KindEditor测试类
 * @author fuyuanwu
 * @since 2012-06-07
 */
@Controller
public class UploadDemoAction extends ActionSupport
{

    private static final long serialVersionUID = 6624518147834729694L;

    // 这里说明一下：KindEditor 它上传的所有类型的附件，如果让Strust2来帮你自动装箱，那么只能的用imgFile来接受。
    // 也就是说你上传一个123.txt附件这里也是用 imgFile 来接收的。
    // 图片对象
    private File imgFile;

    public String uploadImage() throws Exception
    {
        MultiPartRequestWrapper wrapper = (MultiPartRequestWrapper)ServletActionContext.getRequest();

        // 获得图片名字
        String imgName = wrapper.getFileNames("imgFile")[0];

        // 获得图片后缀名
        String fileExt = imgName.substring(imgName.lastIndexOf(".")).toLowerCase();

        Date date = new Date();

        // 图片在服务器上的绝对路径。编辑器并没有提供删除图片功能，此路径以后可以用于后台程序对图片的操作
       // String serverPath = "E:/Tomcat 6.0/webapps/ng/attached/image/" + new SimpleDateFormat("yyyyMMdd").format(date) + "/";
        //String serverPath =" E:/ng_server/server/apachetomcat/webapps/ng/attached/image/"+ new SimpleDateFormat("yyyyMMdd").format(date) + "/";
       
        String serverPath= ServletActionContext.getServletContext().getRealPath(File.separator);
        serverPath=serverPath.replaceAll("\\\\", "/");
        
        String imagePath ="attached/image/"+ new SimpleDateFormat("yyyyMMdd").format(date) + "/";
        serverPath=serverPath+imagePath;

        // 前台页面的要引用图片的地址 <img src="" />
        //注意：这里的路径一定是要服务的下面的文件目录，而且是基于根目录的相对路径。
        //否则富文本框里边会显示不出图片来的。
       // String savePath = "/ng/attached/image/" + new SimpleDateFormat("yyyyMMdd").format(date) + "/";
        String savePath = imagePath;

        // 重新生成图片名字
        String newImgName = date.getTime() + fileExt;

        // 将图片写入服务器
        // ImageUtils.uploadToServer(imgFile, serverPath, imgName);
        FileUtils.copyFile(imgFile, new File(serverPath + "/" + newImgName));
        
        
        boolean isMakeResponseOk = makeSuccessRespForKE(ServletActionContext.getResponse(), savePath + newImgName);

        //删除临时文件。
        if (isMakeResponseOk)
        {
            imgFile.delete();
        }
        else {
            makeErrorRespForKE(ServletActionContext.getResponse(), 999, "uploadFail");           
        }

        return "success";
    }

    /**
     * 成功的时候回写KindEditor。
     * 
     * @param imgServerURL
     * @return
     * @throws FileNotFoundException
     * @throws IOException
     */
    public boolean makeSuccessRespForKE(HttpServletResponse resp, String imgServerURL)
    {
        // 回写给KE页面的返回信息
        JSONObject obj = new JSONObject();
        obj.put("error", 0);
        obj.put("url", imgServerURL);
        PrintWriter out = null;
        try
        {
            out = resp.getWriter();
            out.write(obj.toJSONString());
        }
        catch (IOException e)
        {
            e.printStackTrace();
            return false;
        }
        finally
        {
            if (out != null)
            {
                out.close();
            }
        }
       

        return true;
    }

    /**
     * 失败的时候回写KindEditor。
     * @param resp
     * @param errorCode
     * @param errorMsg
     * @return
     */
    
    public boolean makeErrorRespForKE(HttpServletResponse resp, int errorCode, String errorMsg)
    {
        // 回写给KE页面的返回信息
        JSONObject obj = new JSONObject();
        obj.put("error", errorCode);
        obj.put("msg", errorMsg);
        PrintWriter out = null;
        
        try
        {
            out = resp.getWriter();
            out.write(obj.toJSONString());
        }
        catch (IOException e)
        {
            e.printStackTrace();
            return false;
        } 
        finally
        {
            if (out != null)
            {
                out.close();
            }
        }

        return true;
    }

    public File getImgFile()
    {
        return imgFile;
    }

    public void setImgFile(File imgFile)
    {
        this.imgFile = imgFile;
    }

}